package tulingxueyuan117;

import java.util.HashMap;
import java.util.Map;

/**
 * Author: Zhang Dongwei
 * Date: 2022/4/5 19:39
 * 斐波那契数 （通常用 F(n) 表示）形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始，后面的每一项数字都是前面两项数字的和。也就是：
 *
 * F(0) = 0，F(1) = 1
 * F(n) = F(n - 1) + F(n - 2)，其中 n > 1
 * 给定 n ，请计算 F(n) 。
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/fibonacci-number
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class p6_斐波那契_509_剑指offer10 {
    public static void main(String[] args) {
        int n = 9;
        int res = fib(9);
        System.out.println(res);
    }

    // 递归，没有超时，但是时间过久
    public static int fib1(int n) {
        if(n == 0) return 0;
        if(n == 1) return 1;
        else return fib(n - 1) + fib(n - 2);
    }

    // 和p5类似，使用hashmap，时间较快
    private static Map<Integer, Integer> storeMap = new HashMap<>();
    public static int fib2(int n) {
        if(n == 0) return 0;
        if(n == 1) return 1;
        if(storeMap.get(n) != null) return storeMap.get(n);
        else{
            int res = fib(n - 1) + fib(n - 2);
            storeMap.put(n, res);
            return res;
        }
    }

    // 和p5类似，使用循环实现
    public static int fib(int n) {
        if(n == 0) return 0;
        if(n == 1) return 1;
        int res = 0;
        int pre = 1;
        int prePre = 0;
        for(int i = 2; i <= n; i++){
            res = pre + prePre;
            prePre = pre;
            pre = res;
        }
        return res;
    }
}
